package com.zxl.java8.lambda;

/**
 * lambda表达式的重要特征: 1,可选类型声明：不需要声明参数类型，编译器可以统一识别参数值。
 * 2,可选的参数圆括号：一个参数无需定义圆括号，但多个参数需要定义圆括号。 3,可选的大括号：如果主体包含了一个语句，就不需要使用大括号。
 * 4,可选的返回关键字：如果主体只有一个表达式返回值则编译器会自动返回值，大括号需要指定明表达式返回了一个数值。 5，lambda 表达式只能引用
 * final 或 final 局部变量，这就是说不能在 lambda 内部修改定义在域外的变量，否则会编译错误。
 * 
 * @author za-zhangxiaolong
 *
 */
public class Test1 {

	public static void main(String[] args) {
		Test1 test = new Test1();

		// 类型声明
		MathOperation operation1 = (int a, int b) -> a + b;

		// 不用类型声明
		MathOperation operation2 = (a, b) -> a - b;

		// 大括号中返回语句
		MathOperation operation3 = (int a, int b) -> {
			return a * b;
		};

		// 没有大括号及返回语句
		MathOperation operation4 = (int a, int b) -> a / b;

		System.out.println("10+5=" + test.operate(10, 5, operation1));
		System.out.println("10-5=" + test.operate(10, 5, operation2));
		System.out.println("10*5=" + test.operate(10, 5, operation3));
		System.out.println("10/5=" + test.operate(10, 5, operation4));

		// 不带括号
		GreetingService service1 = message -> System.out.println("Hello " + message);

		// 用括号
		GreetingService service2 = (message) -> System.out.println("Hello " + message);

		service1.sayMessage("Jie");
		service2.sayMessage("Kay");
	}

	interface MathOperation {
		int operation(int a, int b);
	}

	interface GreetingService {
		void sayMessage(String message);
	}

	private int operate(int a, int b, MathOperation mathOperation) {
		return mathOperation.operation(a, b);
	}
}
